/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.Cliente;
import br.jm.acionista.entity.Procurador;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.ClienteEao;
import br.jm.acionista.sistema.eao.ProcuradorEao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class ProcuradorBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Procurador selectedProcurador;
    private Cliente selectedProcuradorAcionista;
    private LazyDataModel<Procurador> lazyModel;
    private List<Cliente> lazyProcuradorAcionista;
    private FacesMessage msg = null;
    private ProcuradorEao ProcuradorJpa;
    private ClienteEao ClienteJpa;
    private Map<String, String> pesquisas = new HashMap<String, String>();
    private Funcoes funcoes = new Funcoes();
    private String[] aCaracteres = {"(", ")", "-", " "};
    private EntityManager sessao;
    private boolean disable;
    private int nTotal;

    public ProcuradorBean() {
        this.disable = true;
        
        selectedProcurador = new Procurador();
        selectedProcuradorAcionista = new Cliente();

        lazyProcuradorAcionista = new ArrayList<Cliente>();

        ProcuradorJpa = ProcuradorEao.getInstance();
        ClienteJpa = ClienteEao.getInstance();

        this.lazyModel = new LazyDataModel<Procurador>() {

            public List<Procurador> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
                List<Procurador> data = new ArrayList<Procurador>();

                try {
                    data = ProcuradorJpa.getNative("Procurador", first, pageSize, sortField, sortOrder, filters, null);
                    this.setPageSize(pageSize);
                    
                    if (data.isEmpty()) {
                        selectedProcurador = new Procurador();
                        selectedProcurador.setNomProcurador("Clique para Inserir um Novo Procurador");
                        data.add(selectedProcurador);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(ProcuradorBean.class.getName()).log(Level.SEVERE, null, ex);
                }

                return data;
            }
        };
        nTotal = ProcuradorJpa.getCount("Procurador");
        if (nTotal == 0) {
            nTotal = 1;
        }
        this.lazyModel.setRowCount(nTotal);

    }

    public LazyDataModel<Procurador> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Procurador> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public List<Cliente> getLazyProcuradorAcionista() {
        return lazyProcuradorAcionista;
    }

    public void setLazyProcuradorAcionista(List<Cliente> lazyProcuradorAcionista) {
        this.lazyProcuradorAcionista = lazyProcuradorAcionista;
    }

    public Procurador getSelectedProcurador() {
        return selectedProcurador;
    }

    public void setSelectedProcurador(Procurador selectedProcurador) {
        if (selectedProcurador == null) {
            selectedProcurador = new Procurador();
        }
        this.selectedProcurador = selectedProcurador;
    }

    public Cliente getSelectedProcuradorAcionista() {
        return selectedProcuradorAcionista;
    }

    public void setSelectedProcuradorAcionista(Cliente selectedProcuradorAcionista) {
        this.selectedProcuradorAcionista = selectedProcuradorAcionista;
    }

    public void preparaInserir(ActionEvent actionEvent) {
        this.disable = false;
        this.lazyProcuradorAcionista = new ArrayList<Cliente>();
        this.selectedProcurador = new Procurador();
    }

    public void inserir(ActionEvent actionEvent) {
        try {
            selectedProcurador.setIdProcurador(null);
            selectedProcurador.setNumTelefone1(funcoes.TiraCaractere(selectedProcurador.getNumTelefone1(), aCaracteres));
            selectedProcurador.setNumTelefone2(funcoes.TiraCaractere(selectedProcurador.getNumTelefone2(), aCaracteres));
            selectedProcurador.setNumTelefone3(funcoes.TiraCaractere(selectedProcurador.getNumTelefone3(), aCaracteres));

            selectedProcurador.setClienteList(lazyProcuradorAcionista);

            ProcuradorJpa.create(selectedProcurador);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Inclusão efetuada com Sucesso ", selectedProcurador.getNomContato());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir " + selectedProcurador.getNomContato(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        try {
            selectedProcurador.setNumTelefone1(funcoes.TiraCaractere(selectedProcurador.getNumTelefone1(), aCaracteres));
            selectedProcurador.setNumTelefone2(funcoes.TiraCaractere(selectedProcurador.getNumTelefone2(), aCaracteres));
            selectedProcurador.setNumTelefone3(funcoes.TiraCaractere(selectedProcurador.getNumTelefone3(), aCaracteres));

            selectedProcurador.setClienteList(lazyProcuradorAcionista);

            ProcuradorJpa.edit(selectedProcurador);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração efetuada com Sucesso ",
                    selectedProcurador.getNomContato());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedProcurador.getNomContato(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        try {
            selectedProcurador.setClienteList(lazyProcuradorAcionista);
            ProcuradorJpa.destroy(selectedProcurador);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Exclusão efetuada com Sucesso ", selectedProcurador.getNomContato());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedProcurador.getNomContato(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void onRowSelectNavigate(SelectEvent event) {
        try {
            this.disable = true;
            
            lazyProcuradorAcionista = new ArrayList<Cliente>();
            Procurador procurador = new Procurador();
            procurador = (Procurador) event.getObject();

            String cSql = "select a.id_cliente,tip_cliente,nom_cliente,nom_proprietario,num_cpf,dat_nasc_abert, "
                    + "dsc_email,dsc_site,dsc_obs,dsc_historico,id_nacionalidade,tip_civil,tip_sexo,a.id_procurador "
                    + "from cliente a, procurador_cliente b "
                    + "where a.id_cliente = b.clienteList_id_cliente and b.procurador_id_procurador = " + procurador.getIdProcurador();

            lazyProcuradorAcionista = ClienteJpa.getNative("", 0, 0, "", true, pesquisas, cSql);

        } catch (Exception ex) {
            Logger.getLogger(BairroBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void deleteAcionista(ActionEvent actionEvent) throws EaoException {
        for (int i = 0; i < lazyProcuradorAcionista.size(); i++) {
            Cliente cliente = lazyProcuradorAcionista.get(i);
            if (cliente == selectedProcuradorAcionista) {
                lazyProcuradorAcionista.remove(i);

                try {
                    sessao = ClienteJpa.openSessaoLote();

                    ClienteJpa.openTransaction(sessao);

                    ClienteJpa.edit(cliente, "S", sessao);

                    ClienteJpa.closeTransaction(sessao);

                    selectedProcurador.setNumTelefone1(funcoes.TiraCaractere(selectedProcurador.getNumTelefone1(), aCaracteres));
                    selectedProcurador.setNumTelefone2(funcoes.TiraCaractere(selectedProcurador.getNumTelefone2(), aCaracteres));
                    selectedProcurador.setNumTelefone3(funcoes.TiraCaractere(selectedProcurador.getNumTelefone3(), aCaracteres));

                    selectedProcurador.setClienteList(lazyProcuradorAcionista);

                    ProcuradorJpa.edit(selectedProcurador);

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Analista Retirado com Sucesso", cliente.getNomCliente());

                } catch (Exception e) {
                    if (this.sessao.isOpen()) {
                        ClienteJpa.closeSessao(sessao);
                    }
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Retirar o Cliente: " + cliente.getNomCliente(), "");
                } finally {
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                }
            }
        }
    }

    public void onRowSelectNavigateCliente(SelectEvent event) {
        try {
            Cliente cliente = new Cliente();
            cliente = (Cliente) event.getObject();

            this.lazyProcuradorAcionista.add(cliente);

        } catch (Exception ex) {
            Logger.getLogger(BairroBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }
    
}
